Cyclic Noise
#ノイズ #GLSL #シェーダー #CG
GLSLで比較的短く書けるFractal Noise・FBM
3次元座標系をディスプレイスメントさせたり回転させながらGyroidのSigned Distance Fieldを足していく
nimitzが作ったらしい
https://gyazo.com/7c9842e71710d4631794723ab42d282d
Wrighterによる解説コード
https://www.shadertoy.com/view/3tcyD7
GLSL
作り方の一例。0b5vrがライブコーディングでよく使う様式
getOrthogonalBasisに依存しているので注意
原文ではノイズの生成を dot で行っているが、こちらは cross を用いて出力を3次元にしている
pump は通常 2.0 を入れる 他の値を入れても面白い
code:glsl
vec3 cyclic(vec3 p, float pers, float lacu) {
vec4 sum = vec4(0);
mat3 rot = orthBas(vec3(2, -3, 1));
for (int i = 0; i < 5; i++) {
p *= rot;
p += sin(p.zxy);
sum += vec4(cross(cos(p), sin(p.yzx)), 1);
sum /= pers;
p *= lacu;
}
return sum.xyz / sum.w;
}
https://gyazo.com/9b3af14e151a8c0fb86e71ff777bd000
https://www.shadertoy.com/view/DlSGR1
Leon Denise版
Leon Deniseが使っているバージョン
座標ドメインに対するディスプレイスのやり方がやや異なり、sin(p.yzx) ではなく生成途中のノイズ自体を足し算している
code:glsl
// Code taken from https://www.shadertoy.com/view/mljfzy (CC BY-NC-SA 3.0)
// gyroid pattern
float gyroid (vec3 p)
{
return dot(sin(p),cos(p.yzx));
}
// noise
float fbm (vec2 p)
{
vec3 q = vec3(p, 0);
float result = 0., a = .5;
for (float i = 0.; i < 4.; ++i, a /= 2.)
{
q += (result-.5);
result += gyroid(q/a)*a;
}
return result;
}
https://www.shadertoy.com/view/mljfzy